package lc.q201_250;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 统计所有小于非负整数 n 的质数的数量。
 *
 * 输入: 10
 * 输出: 4
 * 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
 *
 * @author lgb
 * @date 2020/08/23
 **/
public class Q204 {

    public int countPrimes(int n) {
        // 质数的规律？
        // 将所有的非素数标记
        boolean[] isPrime = new boolean[n];
        Arrays.fill(isPrime, true);
        for (int i = 2; i * i < n; i++) {
            // 到根号n截至比较高效
            if (isPrime[i]) {
                // 将i的倍数都标记为非素数
                for (int j = i * i; j < n; j+= i) {
                    // 从i的平方开始可以减少一些循环，也能保证准确性
                    isPrime[j] = false;
                }
            }
        }
        int count = 0;
        for (int i = 2; i < n; i++) {
            if (isPrime[i]) {
                count ++;
            }
        }
        return count;
    }

}
